#ifndef NET_ACCEPTOR_H
#define NET_ACCEPTOR_H

#include <functional>
#include <memory>
#include "logger.h"
#include "socket.h"
#include "event_loop.h"
#include "channel.h"

namespace net {

/**
 * @brief 处理新连接的接受器
 * 负责监听指定端口，接受新连接并回调处理函数
 */
class Acceptor 
{
public:
    /**
     * @brief 接受新连接的回调函数类型
     * @param connfd 新连接的套接字描述符
     */
    using AcceptCallback = std::function<void(int connfd)>;

    /**
     * @brief 构造函数
     * @param loop 所属EventLoop
     * @param port 监听端口
     */
    Acceptor(EventLoop* loop, int port);

    /**
     * @brief 析构函数
     */
    ~Acceptor();

    /**
     * @brief 设置新连接回调函数
     * @param cb 回调函数
     */
    void setAcceptCallback(const AcceptCallback& cb)
    { _callback = cb; }

    /**
     * @brief 开始监听
     * 必须在设置回调函数后调用
     */
    void listen();

private:
    /**
     * @brief 处理读事件（新连接到来）
     */
    void handleRead();

    /**
     * @brief 创建监听套接字
     * @param port 监听端口
     * @return 套接字描述符
     */
    int createServer(int port);

private:
    Socket _socket;           // 监听套接字
    EventLoop* _loop;         // 所属EventLoop
    Channel _acceptChannel;   // 处理监听套接字事件的Channel
    AcceptCallback _callback; // 新连接回调函数
};

} // namespace net

#endif // NET_ACCEPTOR_H